#include "main.h"

void * pthread_fun(void * arg)
{
    int client_socket = *(int *)arg;
    while (1)
    {
        // 5.开始通讯(B/S)
        char buff[1024] = {0};

        int ret = recv(client_socket,buff,1024,0);
        if(ret <= 0)break;
        printf("%d: %s\n",client_socket,buff);
        send(client_socket,buff,(int)strlen(buff),0);
    }
    printf("%d 已下线\n",client_socket);
        // 6.关闭连接
    close(client_socket);
    pthread_exit(NULL);
}


int main(int argc,char *argv[])
{
    if(argc < 3) {
        perror("argc error");
        return -1;
    }
    //1.创建socket套接字
    int listen_socket = socket(AF_INET,SOCK_STREAM,0);
    if(-1 == listen_socket)
    {
        printf("创建套接字失败！ errcode:%d\n",errno);
        return -1;
    }
   
    // 2.给socket绑定端口号
    struct sockaddr_in local = {0};
    local.sin_family = AF_INET;
    local.sin_port = htons(atoi(argv[2]));
    local.sin_addr.s_addr = inet_addr(argv[1]);

    if(-1 == bind(listen_socket,(struct sockaddr*)&local,sizeof(local)))
    {
        printf("绑定套接字失败！ errcode:%d\n",errno);
        return -1;
    }
    // 3.socket开启监听属性  接收连接，底层通讯
   if(-1 == listen(listen_socket,10))
   {
        printf("监听失败！ errcode:%d\n",errno);
        return -1;
   }
    // 4.等待客户端连接
    int client_socket;
    pthread_t thread;
    while(1)
    {   
        int client_socket = accept(listen_socket,NULL,NULL);
        if(-1 == client_socket)
            continue;
            //创建线程
            printf("%d 已上线\n",client_socket);
            if (pthread_create(&thread, NULL, pthread_fun, &client_socket) != 0)  
            {  
                perror("线程创建失败！");  
                close(client_socket);  
                continue;  
            }  
            pthread_detach(thread); 
       
    }

    return 0;
}

// int main()
// {
//     char ip[20];  
//     int port;  
//     char port_str[6]; // 假设端口号不会超过5位数，加上'\0'共6个字符  
  
//     printf("请输入IP地址和端口号\n");  
//     scanf("%19s %d", ip, &port); // 限制IP地址输入长度为19，防止溢出  
  
//     // 使用sprintf将端口号转换为字符串  
//     sprintf(port_str, "%d", port);  
  
//     // 模拟argv数组  
//     char *argv[3] = {NULL, strdup(ip), strdup(port_str)};  
//     argv[0] = "dummy"; // 模拟argv[0]为程序名  
  
//     // 调用server函数  
//     server(3, argv);  
  
//     // 清理动态分配的内存  
//     free(argv[1]);  
//     free(argv[2]);  


//     return 0;
// }